package com.heihei.util.str2byte;

import java.io.*;

/**
 *  字符流文件和字节流文件的互相转换 参考
 *  （适用于每行只有一个double类型数字的txt文件）
 *
 * @author duanhf
 * 2021年11月05日 15:32:55
 */
public class StrDouble2ByteFileUtil {

    /**
     * 将txt转换为字节数组存储到目标文件
     *
     * @author duanhf
     * 2021年11月05日 14:39:00
     */
    public static void transTxt2ByteArr(File srcFile, File outputFile) {
        BufferedReader br = null;
        BufferedOutputStream bos = null;
        try {
            br = new BufferedReader(new InputStreamReader(new FileInputStream(srcFile), "UTF-8"));
            bos = new BufferedOutputStream(new FileOutputStream(outputFile));
            String s = null;
            while((s = br.readLine())!=null){
                Double doVal = Double.valueOf(s);
                byte[] byteVal = ByteArrayConveter.getByteArray(doVal);
                bos.write(byteVal);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                br.close();
                bos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 将字节数组的二进制文件，转换回原本的txt
     *
     * @author duanhf
     * 2021年11月05日 14:39:20
     */
    public static void transByteArr2Txt(File srcFile, File outputFile) {
        BufferedInputStream bis = null;
        BufferedWriter bw = null;
        try {
            bis = new BufferedInputStream(new FileInputStream(srcFile));
            bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outputFile), "UTF-8"));
            byte[] byteArr = new byte[8];
            //标识是否是第一行
            boolean isFirstLine = true;
            //一次读8个字节，就是一个double数字
            breEndPoint: while (true) {
                for (int i = 0; i < byteArr.length; i++) {
                    int by = bis.read();
                    if(by == -1) {
                        //已经读到文件尾，直接跳出外层循环
                        break breEndPoint;
                    }
                    byteArr[i] = (byte) by;
                }
                Double douVal = ByteArrayConveter.getDouble(byteArr, 0);
                //第一行的话，原样写出； 此后，先换行，再写出
                if(isFirstLine) {
                    isFirstLine = false;
                } else {
                    bw.newLine();
                }
                bw.write(douVal.toString());
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                bis.close();
                bw.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        transTxt2ByteArr(new File("D:\\安装包\\23_211105问题\\测试数据01\\DQ_AMOUNT_替换掉NaN"), new File("D:\\安装包\\23_211105问题\\测试数据01\\DQ_AMOUNT_替换掉NaN（转换后的字节码文件）"));

        transByteArr2Txt(new File("D:\\安装包\\23_211105问题\\测试数据01\\DQ_AMOUNT_替换掉NaN（转换后的字节码文件）"), new File("D:\\安装包\\23_211105问题\\测试数据01\\DQ_AMOUNT_替换掉NaN_逆转data.txt"));
    }
}
